package login

import (
	"context"
	"database/sql"
	v1 "donkey-admin/api/role/v1"
	"donkey-admin/internal/dao"
	"donkey-admin/internal/model/entity"
	"errors"
	"github.com/gogf/gf/v2/frame/g"
)

func (s *sRole) RoleGetPermission(ctx context.Context, req *v1.RoleGetPermissionReq) (res *v1.RoleGetPermissionRes, err error) {

	menuArray, err := dao.SysRoleMenu.Ctx(ctx).Where("role_code", req.RoleCode).
		Fields("menu_id").Array()
	if err != nil {
		return nil, err
	}

	var RoleMenus []entity.SysMenu
	err = dao.SysMenu.Ctx(ctx).Where("uuid", menuArray).Where("menu_parent_id", "").
		With(entity.SysMenu{}).Order("menu_order asc").Scan(&RoleMenus)
	if err != nil && errors.Is(err, sql.ErrNoRows) {
		g.Log().Error(ctx, err)
		return nil, err
	}

	var AllMenus []entity.SysMenu
	err = dao.SysMenu.Ctx(ctx).Where("menu_parent_id", "").
		With(entity.SysMenu{}).Order("menu_order asc").Scan(&AllMenus)
	if err != nil && errors.Is(err, sql.ErrNoRows) {
		g.Log().Error(ctx, err)
		return nil, err
	}

	apiArray, err := dao.CasbinRule.Ctx(ctx).Where("v0", req.RoleCode).Fields("v1").Array()
	if err != nil {
		return nil, err
	}

	var apis []entity.SysApis
	err = dao.SysApis.Ctx(ctx).Where("api_path", apiArray).Scan(&apis)
	if err != nil {
		return nil, err
	}

	var allApis []entity.SysApis
	err = dao.SysApis.Ctx(ctx).Scan(&allApis)
	if err != nil {
		return nil, err
	}

	return &v1.RoleGetPermissionRes{
		RoleApis:  apis,
		AllApis:   allApis,
		RoleMenus: RoleMenus,
		AllMenus:  AllMenus,
	}, nil
}
